package com.entersoft.sicep.log4j;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Hashtable;
import java.util.Properties;

/**
 * Package: log4j
 * Clase: PropertiesUtil
 * Descripción: Propiedades de log.
 * Versión SICEP: 3.0
 * Autor: Cesar Pino - Entersoft
 * fecha creación: xx/xx/2012
 * ----------------------------------
 * 
 * Modificado por: XXXXXXXXXXXXXXXXXX
 * Motivo de actualización: XXXXXXXXX
 * XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
 * fecha actualización: xx/xx/2012
 */
public final class PropertiesUtil {
	
	private PropertiesUtil(){
		super();
	}
	
	private static final String PROPERTY_FOLDER_PREFIX = "/WAPPS";
	
	private static Hashtable propiedades = null;
	
	/**
	 * Obtiene el valor de  key en el archivo fileProperty
	 * @param fileProperty
	 * @param key
	 * @return
	 */
	public static String getProperty(String fileProperty, String key) {
		String result = null;
		synchronized(PropertiesUtil.class){
			if( propiedades == null )
				propiedades = new Hashtable();	
			
			
			try{
				
				Object obj = propiedades.get( fileProperty+"/"+key ); 
				
				if(obj == null){
				
					Properties pr = new Properties();
					File file = Fileutils.findFirstFileInClasspath( PROPERTY_FOLDER_PREFIX + "/" + fileProperty );
					pr.load(new FileInputStream(file));
					result = pr.getProperty( key );
					
					if( result != null &&  !result.trim().equals(""))  
						propiedades.put( fileProperty+"/"+key, result );
				
				
								
				}
				else{
					result = (String)obj;
					
				}
			}
			catch(Exception e){
				result = "";
			}		
			return result;
		}
		
	}
	
	
	/**
	 * Obtiene el valor de  key en el archivo fileProperty
	 * @param fileProperty
	 * @param key
	 * @return
	 */
	public static String getPropertyNotNull(String fileProperty, String key) {
		
				
		String result = getProperty(fileProperty, key);
		if( result == null )  result = "";
		return result.trim();
	}
	
	
	/**
	 * Obtiene el valor de  key en el archivo fileProperty separado por ;
	 * 
	 * @param fileProperty
	 * @param key
	 * @return si no encuentra la propiedad retorna un array de largo 2 con 2 blancos. 
	 * si la encuentra retorna el array correspondiente.
	 */
	public static String [] getArrayPropertyNotNull(String fileProperty, String key) {
		
		String [] retorno = null;
		String result = getProperty(fileProperty, key);
		if( result == null )  result = null;
		if( result == null) {
			retorno = new String[2];
			retorno[0] = "";
			retorno[1] = "";
		}
		else {
			retorno = Split.split(result, ";");
                        //retorno [0]= "aca va la clase Split que esta inhibida";
		}
		return retorno;
	}			
	
	
	/**
	 * Obtiene el valor de  <strong>prefix + key</strong> o <strong>prefix +  "." + key</strong> 
	 * en el archivo fileProperty
	 * @param fileProperty
	 * @param key
	 * @return
	 */
	public static String getProperty(String fileProperty, String prefix, String key) {
		synchronized(PropertiesUtil.class){
			if( propiedades == null )
				propiedades = new Hashtable();	
			
			
			String result = null;
			try{
				
				
				Object obj = propiedades.get( fileProperty +"/"+ prefix + "." + key ); 
				
				if(obj == null){
				
					Properties pr = new Properties();
					File file = Fileutils.findFirstFileInClasspath( PROPERTY_FOLDER_PREFIX + "/" + fileProperty );
					pr.load(new FileInputStream(file));
					result = pr.getProperty( prefix + key );
					if( result == null || "".equals(result.trim()))
					     result = pr.getProperty( prefix + "." + key );
					     
					     
					if( result != null && !result.trim().equals(""))
						propiedades.put( fileProperty +"/"+ prefix + "." + key , result );
					
					
				}  
				else{
					result = (String)obj;   
					
				}
			}
			catch(Exception e){
				result = null;
			}		
			return result;
		}
		
	}	
	
	/**
	 * Obtiene el conjunto propiedades del archivo fileProperty
	 * @param fileProperty
	 * @return
	 */
	public static Properties getProperty(String fileProperty ) {
		
		Properties result = null;
		try{
			Properties pr = new Properties();
			File file = Fileutils.findFirstFileInClasspath( PROPERTY_FOLDER_PREFIX + "/" + fileProperty );
			pr.load(new FileInputStream(file));
			result = pr;
		}
		catch(Exception e){
			result = null;
		}		
		return result;
	}	
	
	
	/**
	 * Busca un archivo en el classpath de la pws
	 * @param pathFile
	 * @return
	 */
	public static File findFile(String pathFile ) {
		
		return Fileutils.findFirstFileInClasspath( PROPERTY_FOLDER_PREFIX + "/" + pathFile );
	}



	public static String setFile(String ruta, String contenido){
		File file = null;
		try{
			

				FileWriter out;
				
				file = Fileutils.findFirstFileInClasspath(PROPERTY_FOLDER_PREFIX + "/" +ruta);
				
				if(file != null  &&  file.exists()){
					file.delete();

				}

					
				out = new FileWriter(file.getAbsolutePath(), true);
				out.write(contenido);
				out.close();
		}
		catch(IOException e){
			Log4jUtil.instance().error(PropertiesUtil.class,e.getMessage(), e);
		}
		
		return file.getAbsolutePath();
	}
	
	public static void clearCache(){
		synchronized(PropertiesUtil.class){
			if(propiedades != null){
				propiedades.clear();
				propiedades = null;
			}
		}
	}
	
}
